/*
* 既然是规范，那么CommonJS就是遵循一定的规则去制定而成的模块化
    一、概念
        1. CommonJS的每一个文件就是一个模块，有自己的作用域。里面定义的变量、函数、类都是私有的，对其他文件不可见。
        2. 在服务端，模块的加载是同步加载；在浏览器端，模块需要提前编译打包处理。
    二、特点
        1. 每个文件就是一个模块，因此文件内代码都运行在模块作用域中，不会污染全局作用域
        2. 模块可以多次加载，但是只会在第一次加载时运行一次，运行结果会被缓存。如果要再次运行，需要先清除缓存
        3. 模块的加载顺序，是根据模块在代码中出现的顺序而定的
    三、语法
        1. 暴露模块：module.exports = value 或 exports.xxx = xxx
        2. 引入模块：require(xxxx) - 加载模块文件，读入并执行一个JS文件，返回该模块的 exports 对象
            2.1 第三方模块，xxxx代表模块名
            2.2 自定义模块，xxxx代表需引入模块的文件路径
            2.3 如果没有发现指定模块，则报错。eg：moduleC
    四、使用
        node xxx.js 运行js文件 / 使用打包编译工具使用
    
*/

console.log('-------------------- moduleA分割线 --------------------')
const moduleA = require('./moduleA')
console.log(moduleA.name)
moduleA.consoleFn()
moduleA.changeName('newModuleA')
moduleA.consoleFn()

console.log('-------------------- moduleB分割线 --------------------')

const moduleB = require('./moduleB')
console.log(moduleB.name)
moduleB.consoleFn()
moduleB.changeName('newModuleB')
moduleB.consoleFn()

console.log('-------------------- moduleB1分割线 --------------------')

const moduleB1 = require('./moduleB')
moduleB1.moduleBB.consoleOtherModule()

console.log('-------------------- moduleC分割线 --------------------')

const moduleC = require('./moduleC') // Error: Cannot find module './moduleC'
console.log(moduleC.name)